/**
 * elancom Corporation copy right 2012 - 2015  
 *   
 * $Header: https://192.168.1.224/svn/elancom/product/elancom-platform/trunk/src/main/java/com/elancom/framework/dao/AbstractGenericDAO.java 1034 2012-07-02 03:09:12Z lanzhouxue $
 * $Id: AbstractGenericDAO.java 1034 2012-07-02 03:09:12Z lanzhouxue $
 * $Author: lanzhouxue $
 * $Date: 2012-07-02 11:09:12 +0800 (周一, 02 七月 2012) $
 * $Revision: 1034 $
 */
package com.elancom.framework.dao;

import com.elancom.framework.entity.AbstractEntity;

/**
 * @author elancom
 * @date Apr 9, 2012
 */
public interface AbstractDAO<M extends AbstractEntity> extends GenericDAO<M> {
	/**
	 * 判断当前实体是否存在于当前会话中
	 * 
	 * @param entity
	 */
	boolean contains(M entity);

	/**
	 * 从一级缓存中移除该实体对象
	 * 
	 * @param entity
	 */
	void evictCache(M entity);

	M getById(String id, String... fetchAssociation);

	/**
	 * 合并对象数据<br>
	 * 通过给定的实体进行数据上的判断然后进行不同的操作 <br>
	 * 
	 * <pre>
	 * transient : 瞬时态
	 * 			1,有ID,执行查询，并且判断数据与该实体对象的数据一致
	 * 					a)一致,什么都没做 
	 * 					b)不一致,执行更新
	 *       	2,无ID,执行插入
	 * detached  : 脱管态
	 * 			处理方式和transient状态是一样的
	 * 
	 * persistent: 持久化
	 * 			1,肯定有ID,判断数据是否被改变
	 *  				a)不改变,什么都不做
	 *  				b)改变,执行更新
	 * </pre>
	 * 
	 * @param entity
	 * @return 返回持久化对象,有可能与参数是同一个引用
	 */
	M mergr(M entity);

	/**
	 * 重新获取数据对象<br>
	 * 比如底层数据库因为某些原因修改了数据
	 * 
	 * @param entity
	 *            具有持久化状态的实体
	 */
	void refresh(M entity);

	void removes(String ids);
}
